<?php

defined('BASEPATH') or die('forbidden');

/**
 * 输入类
 * @author  Karson
 * @name    input.php
 * @since   2012-8-15 18:00:00
 */
class Input {

    public static $get_magic_quotes_gpc;
    public static $magic_quotes_gpc;
    public $url_segment;

    function __construct() {
        $framework = & get_instance();
        self::$get_magic_quotes_gpc = get_magic_quotes_gpc();
        self::$magic_quotes_gpc = $framework->config['open_magic_quotes_gpc'];
        $this->url_segment = $framework->url_segment;

        if (self::$get_magic_quotes_gpc && !self::$magic_quotes_gpc) {  //get_magic_quotes_gpc = on，同时框架要求对提交的数据不转义时，取消转义
            $magic_func = 'deep_stripslashes';
        } elseif (!self::$get_magic_quotes_gpc && self::$magic_quotes_gpc) {  //get_magic_quotes_gpc = off，同时框架要求对提交的数据转义时，添加转义
            $magic_func = 'deep_addslashes';
        } else {
            //由get_magic_quotes_gpc进行操作
        }
        //需要进行转义和取消转义操作
        if (isset($magic_func)) {
            foreach (array('_GET', '_POST', '_REQUEST', '_SERVER', '_COOKIE') as $var) {
                if (!isset($GLOBALS[$var]))
                    continue;
                $GLOBALS[$var] = $this->$magic_func($GLOBALS[$var]);
            }
        }
    }

    //获取转义数据，进行函数处理
    private function get_gpc($GPC, $key, $functions = null) {
        if (isset($GPC[$key])) {
            $var = $GPC[$key];
            unset($GPC[$key]);
            if (is_null($functions)) {
                return $var;
            } else {
                if (!is_array($functions))
                    $functions = explode('|', $functions);
                else if (is_bool($functions) && $functions == true)
                    $functions = array('html2text');

                //用函数开始处理
                foreach ($functions as $function) {
                    if (function_exists($function)) {
                        if (is_array($var)) {
                            foreach ($var as $m => $n) {
                                $var[$m] = $function($n);
                            }
                        } else {
                            $var = $function($var);
                        }
                    } else if (method_exists($this, $function)) {
                        if (is_array($var)) {
                            foreach ($var as $m => $n) {
                                $var[$m] = $this->$function($n);
                            }
                        } else {
                            $var = $this->$function($var);
                        }
                    }
                }
                return $var;
            }
        } else {
            return false;
        }
    }

    /**
     * 获取GET信息
     * @param string $name 请求的获取GET信息名称
     * @param mixed $functions 是否需要对数据进行函数操作，默认null，可选数组，字符串，逻辑值，字符串以|分隔，为true时进行html2text操作
     * @return string
     */
    function get($name, $functions = null) {
        return $this->get_gpc($_GET, $name, $functions);
    }

    /**
     * 获取POST信息
     * @param string $name 请求的获取POST信息名称
     * @param mixed $functions 是否需要对数据进行函数操作，默认null，可选数组，字符串，逻辑值，字符串以|分隔，为true时进行html2text操作
     * @return string
     */
    function post($name, $functions = null) {
        return $this->get_gpc($_POST, $name, $functions);
    }

    /**
     * 获取COOKIE信息
     * @param string $name 请求的获取COOKIE信息名称
     * @param mixed $functions 是否需要对数据进行函数操作，默认null，可选数组，字符串，逻辑值，字符串以|分隔，为true时进行html2text操作
     * @return string
     */
    function cookie($name, $functions = null) {
        return $this->get_gpc($_COOKIE, $name, $functions);
    }

    /**
     * 获取SERVER信息
     * @param string $name 请求的SERVER名称
     * @param mixed $functions 是否需要对数据进行函数操作，默认null，可选数组，字符串，逻辑值，字符串以|分隔，为true时进行html2text操作
     * @return string
     */
    function server($name, $functions = null) {
        return $this->get_gpc($_SERVER, $name, $functions);
    }

    /**
     * 获取元素URL指定分段位置值
     * @param int $index 分段的位置，位置从1算起
     * @param string $default 当未获取到指定位置值的时候的默认值，默认为空
     * @param string $slash 前后加上/，默认为空，可选值first,final
     * @return string 成功返回指定位置值，失败返回default的值
     */
    function segment($index, $default = '', $slash = '') {
        if (!empty($this->url_segment[$index]) && isset($this->url_segment[$index]))
            if ($slash == 'first') {
                return '/' . $this->url_segment[$index];
            } else if ($slash == 'final') {
                return $this->url_segment[$index] . '/';
            } else {
                return $this->url_segment[$index];
            }
        else
            return $default;
    }

    /**
     * 获取客户端的IP
     * @return string
     */
    function ip() {
        return get_ip();
    }

    /**
     * HTML转文本，去除style和script
     * @param string $str 需要转换的数据
     * @return string
     */
    function html2text($str) {
        $str = preg_replace("/<sty(.*)\\/style>|<scr(.*)\\/script>|<!--(.*)-->/isU", '', $str);
        $str = str_replace(array('<br />', '<br>', '<br/>'), "\n", $str);
        $str = strip_tags($str);
        return $str;
    }

    /**
     * 对数组或字符串转义
     * @param mixed $var 需要转义的数据
     * @return mixed
     */
    function deep_addslashes($var) {
        if (is_array($var)) {
            foreach ($var as $key => $val) {
                $var[$key] = $this->deep_addslashes($val);
            }
            return $var;
        } else
            return is_bool($var) || is_numeric($var) ? $var : addslashes($var);
    }

    /**
     * 对数组或字符串取消转义
     * @param mixed $var 需要取消转义的数据
     * @return mixed
     */
    function deep_stripslashes($var) {
        if (is_array($var)) {
            foreach ($var as $key => $val) {
                $var[$key] = $this->deep_stripslashes($val);
            }
            return $var;
        } else
            return is_bool($var) || is_numeric($var) ? $var : stripslashes($var);
    }

}
